/**
 * Copyright(c) 2014-2016 Basung Information Technology (Shanghai) Co., Ltd.
 * <p>
 * 　　　　　　　　┏┓　　　┏┓+ +
 * 　　　　　　　┏┛┻━━━┛┻┓ + +
 * 　　　　　　　┃　　　　　　　┃
 * 　　　　　　　┃　　　━　　　┃ ++ + + +
 * 　　　　　　 ████━████ ┃+
 * 　　　　　　　┃　　　　　　　┃ +
 * 　　　　　　　┃　　　┻　　　┃
 * 　　　　　　　┃　　　　　　　┃ + +
 * 　　　　　　　┗━┓　　　┏━┛
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┃ + + + +
 * 　　　　　　　　　┃　　　┃　　　　Code is far away from bug with the animal protecting
 * 　　　　　　　　　┃　　　┃ + 　　　　神兽保佑,代码无bug
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┃　　+
 * 　　　　　　　　　┃　 　　┗━━━┓ + +
 * 　　　　　　　　　┃ 　　　　　　　┣┓
 * 　　　　　　　　　┃ 　　　　　　　┏┛
 * 　　　　　　　　　┗┓┓┏━┳┓┏┛ + + + +
 * 　　　　　　　　　　┃┫┫　┃┫┫
 * 　　　　　　　　　　┗┻┛　┗┻┛+ + + +
 * <p>
 * History:
 * 2016/10/21 上午10:37 Created by leijinghan
 */
package com.jade.modules.message.sms.ruanwei;

import com.jade.framework.base.JadeSystem;
import com.jade.framework.base.util.DataUtils;
import com.jade.modules.message.sms.*;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

/**
 * Explain: 天下畅通 sms
 * Description:
 *
 * @Author : <a href="mailto:jinghan.lei@basung.com">leijinghan</a>.
 * @Version: 1.0
 * @Date : 2016/10/21.
 */
public class RuanweiSmsClient extends AbstractSmsClient {

    protected String url;
    protected String uid;
    protected String ua;
    protected String pw;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getUa() {
        return ua;
    }

    public void setUa(String ua) {
        this.ua = ua;
    }

    public String getPw() {
        return pw;
    }

    public void setPw(String pw) {
        this.pw = pw;
    }

    public SmsResult send(SmsMessage message, SmsServiceParams params) {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        CloseableHttpResponse httpResponse = null;
        try {
            String url = smsUrl("send", uid, ua, pw, StringUtils.join(message.getTo(), ','), message.getContentString());
            url = getUrl()+"?"+url;
            HttpGet httpGet = new HttpGet(url);

            httpResponse = httpclient.execute(httpGet);
            StatusLine statusLine = httpResponse.getStatusLine();
            if (statusLine.getStatusCode() >= 300) {
                return new SmsResult(message.getTo().length, SmsStatus.SC_NETWORK_ERROR, statusLine.toString());
            }
            HttpEntity responseEntity = httpResponse.getEntity();
            String response = EntityUtils.toString(responseEntity);
            EntityUtils.consume(responseEntity);
            //parse sms response
            String[] array = response.split(",");
            System.out.println("***"+response);
            int code = DataUtils.getInt(array[0], -99);
            String msgId = array.length > 1 ? array[1] : null;
            int status = SmsStatus.SC_SERVER_ERROR;
            if (response.contains("<returnstatus>Success</returnstatus>")) {
                status = SmsStatus.SC_OK;
            }
            return new SmsResult(message.getTo().length, msgId, status, array[0]);
        }
        catch (Throwable t) {
            return new SmsResult(message.getTo().length, SmsStatus.SC_SERVER_ERROR, t.getMessage());
        }
        finally {
            if (httpResponse != null) {
                try {
                    httpResponse.close();
                }
                catch (Throwable t) {
                    JadeSystem.getLog().warn("Can't colse http response");
                }
            }
        }
    }

    private String smsUrl(String action, String userid, String account,
                          String password, String mobile, String content) throws Exception
    {
        return smsUrl(action, userid, account, password, mobile, content, "", "", "");
    }

    private String smsUrl(String action, String userid, String account,
                                  String password, String mobile, String content,
                                  String sendTime, String codingType, String backEncodType) throws Exception
    {
        StringBuffer send = new StringBuffer();

        if (codingType == null || codingType.equals("")) {
            codingType = "UTF-8";
        }
        if (backEncodType == null || backEncodType.equals("")) {
            backEncodType = "UTF-8";
        }

        if (action != null && !action.equals("")) {
            send.append("action=").append(action);
        } else {
            send.append("action=send");
        }

        send.append("&userid=").append(userid);
        send.append("&account=").append(account);
        send.append("&password=").append(password);
        send.append("&mobile=").append(mobile);
        send.append("&content=").append(content);
        if (sendTime != null && !sendTime.equals("")) {
            send.append("&sendTime=").append(sendTime);
        }
        return send.toString();
    }
}
